package cn.ssm.controller;


import cn.ssm.pojo.Bill;
import cn.ssm.pojo.BillProvider;
import cn.ssm.pojo.Provider;
import cn.ssm.service.BillService;
import cn.ssm.service.ProviderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;


@Controller
public class BillController {
    Logger logger = LoggerFactory.getLogger(getClass());


    @Autowired
    private ProviderService  providerService;

    @Autowired
    private BillService billService;

    @GetMapping("/bills")
    /**
     * 查询账单列表并准备相关数据
     * 此方法主要用于查询账单列表，并同时获取所有供应商信息，以便在页面上进行展示或进一步处理
     * 它将账单信息和供应商信息放入一个Map对象中，供后续使用
     *
     * @param map 用于存储账单和供应商信息的Map对象，以便传递给视图
     * @param bill 账单对象，包含查询条件
     * @return 返回账单列表页面的视图名称
     */
    public String list(Map<String, Object> map, Bill bill) {
        // 记录账单列表查询的日志信息
        logger.info("帐单列表查询。。。" + bill);

        // 调用服务层方法获取账单信息列表
        List<BillProvider> billProviders = billService.getBills(bill);

        // 获取所有的供应商
        List<Provider> providers = providerService.selectAll(null);

        // 将账单信息和供应商信息放入map中，以便传递给视图
        map.put("billProviders", billProviders);
        map.put("providers", providers);

        // 用于搜索处回显数据
        map.put("billName", bill.getBillName());
        map.put("pid", bill.getPid());
        map.put("pay", bill.getPay());

        // 返回账单列表页面的视图名称
        return "bill/list";
    }

    /**
     * type = null 进入查看详情页面view.html，
     * type=update 则是进入update.html
     * @return
     */
    /**
     * 根据账单ID查询账单详细信息并根据请求类型决定显示模式
     *
     * @param bid 账单ID，用于查询特定账单的详细信息
     * @param type 操作类型，默认为"view"，当为"update"时，将提供更新账单的界面
     * @param map 用于传递数据到视图的Map对象
     * @return 返回账单详情页面或更新页面，具体取决于type参数
     */
    @GetMapping("/bill/{bid}")
    public String view(@PathVariable("bid") Integer bid,
                       @RequestParam(value="type", defaultValue = "view") String type,
                       Map<String, Object> map) {
        // 记录查询账单详细信息的日志
        logger.info("查询" + bid + "的详细信息");

        // 通过账单ID获取账单详细信息
        BillProvider billProvider = billService.getBillByBid(bid);

        // 如果请求类型为"update"，则查询所有供应商信息并传递给视图，以便更新账单信息
        if( "update".equals(type)) {
            List<Provider> providers = providerService.selectAll(null);
            map.put("providers", providers);
        }

        // 将账单详细信息传递给视图
        map.put("billProvider", billProvider);

        // 根据请求类型返回不同的视图页面
        // type = null 则进入view.html， type=update 则是进入update.html
        return "bill/" + type;
    }

    //修改信息
    @PutMapping("/bill")
    public String update(Bill bill) {
        logger.info("更改信息。。。");
        //更新操作
        billService.updateBill(bill);

        return "redirect:bills";
    }

    //前往添加 页面
    @GetMapping("/bill")
    public String toAddPage(Map<String, Object> map) {
        //查询所有供应端
//        List<Provider> providers = providerMapper.getProviders(null);
        map.put("providers", providerService.selectAll(null) );
        return "bill/add";
    }


    //添加数据
    @PostMapping("/bill")
    public String add(Bill bill) {
        logger.info("添加数据" + bill);
        //保存数据操作
        billService.addBill(bill);

        return "redirect:/bills";
    }

    //删除
    @DeleteMapping("/bill/{bid}")
    public String delete(@PathVariable("bid") Integer bid) {
        logger.info("删除操作, bid=" + bid);
        billService.deteleBillByBid(bid);
        return "redirect:/bills";
    }

}

